//
// Created by Joy on 2024/7/23.
//

#include "iostream"
#include "stdbool.h"
#define MAXSIZE 100
using namespace std;

// 顺序栈的结构体定义
typedef struct {
    int data[MAXSIZE];
    int top;
}SqStack;

// 初始化栈
void InitStack(SqStack *s){
    s->top = -1;
}

//判断栈是否为空
int StackEmpty(SqStack s){
    if (s.top == -1){
        return 1;
    } else{
        return 0;
    }
}

//是否已满
int StackFull(SqStack s){
    if (s.top == MAXSIZE -1){
        return 1;
    } else{
        return 0;
    }
}
//入栈
bool Push(SqStack *s,int value){
    if (StackFull(*s)){
        return false;
    }
    s->data[++s->top] = value;
    return true;
}
//出栈
bool Pop(SqStack *s,int *e){
    if (StackEmpty(*s)){
        return false;
    }
    *e = s->data[s->top--];//先取值，后--
    return true;
}
//读取栈顶元素
bool GetTop(SqStack s,int *e){
    if (StackEmpty(s)){
        return false;
    }
    *e = s.data[s.top];
    return true;
}
//遍历
bool PrintStack(SqStack s){
    if (StackEmpty(s)){
        return false;
    }
    SqStack *p;
    p = &s;
    cout<<"栈顶--》栈低：\t";
    while (p->top != -1){
        cout << p->data[p->top] << "\t";
        p->top--;
    }
}
int main() {
    SqStack s;
    InitStack(&s);
    for (int i = 0; i < 20; ++i) {
        Push(&s,i);
    }
    int TopV = NULL;
    GetTop(s,&TopV);
    cout<<"top:" << TopV <<endl;

    PrintStack(s);
    int v;
    for (int i = 0; i < 5; ++i) {
        Pop(&s,&v);
    }
    printf("\n出栈后：");
    PrintStack(s);
    return 0;
}
